package com.quyunshuo.module.home.room.manager

import com.quyunshuo.module.home.room.dao.PoetDao
import com.quyunshuo.module.home.room.entity.PoetEntity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext

class PoetRepository(private val poetDao: PoetDao) {
    // 获取所有诗人
    val allPoets: Flow<List<PoetEntity>> = poetDao.getAllPoets()


    // 按ID获取诗人
    fun getPoetById(id: Long): Flow<PoetEntity> {
        return poetDao.getPoetById(id)
    }

    // 随机获取几位诗人
    fun getRandomPoets(count: Int = 5): Flow<List<PoetEntity>> {
        return poetDao.getRandomPoets(count)
    }


    // 插入诗人
    suspend fun insert(poet: PoetEntity) {
        withContext(Dispatchers.IO) {
            poetDao.insert(poet)
        }
    }

    // 插入所有诗人
    suspend fun insertAll(poets: List<PoetEntity>) {
        withContext(Dispatchers.IO) {
            poetDao.insertAll(poets)
        }
    }

    suspend fun getIdAndPoetList(): MutableMap<Long, PoetEntity> {
        return withContext(Dispatchers.IO) {
            val list = poetDao.getAll()
            list.associateBy { it.id }
        }.toMutableMap()//todo 是否需要可变？看你需要不需要修改
    }

  /*  // 使用 runBlocking 在 IO 调度器上执行阻塞操作
    // 这会暂停当前线程直到操作完成，通常用于初始化操作
    private val _projects: MutableMap<Long, PoetEntity> =
//   todo 不推荐使用     runBlocking(Dispatchers.IO) {  // 在 IO 线程池中执行阻塞操作
        runBlocking(Dispatchers.IO) {
            // 从数据库获取所有诗人实体
            val allPoets = poetDao.getAll()

            // 将诗人列表转换为映射，以诗人ID作为键
            // associateBy 是 Kotlin 集合操作函数，用于创建映射
            allPoets.associateBy { it.id }
        }.toMutableMap()  // 将结果转换为可变映射

    // 公开的只读项目映射
    // 外部只能读取，不能修改
    val projects: Map<Long, PoetEntity>
        get() = _projects  // 返回内部可变映射的只读视图*/

    // 删除所有诗人
    suspend fun deleteAll() {
        withContext(Dispatchers.IO) {
            poetDao.deleteAll()
        }
    }
}